object Demo20Implicit {
  def main(args: Array[String]): Unit = {
    /**
     * Scala中的隐式转换：
     * 在Scala中有些东西可以省略由编译器自动去推断
     *
     * 隐式转换的分类：
     * 1、隐式转换函数
     * 2、隐式转换变量
     * 3、隐式转换类
     */

    // 1、隐式转换函数

    // func1的类型：Int => Unit
    def func1(int: Int): Unit = {
      println(int + 100)
    }

    func1(100) // 200
    func1(200) // 300
    // func1需要接收一个Int类型的参数，这里传入了一个String类型的参数
    // Scala是静态数据类型，会对类型进行检测，不匹配时会报错
    //    func1("100")

    // 如果想要给func1 传入一个字符串

    // 第一种方式
    func1(Integer.parseInt("100")) // 200

    // 第二种方式
    def str2Int(str: String): Int = {
      Integer.parseInt(str)
    }

    func1(str2Int("100")) // 200

    // 第三种方式：隐式转换函数
    // str2IntImplicit: String => Int
    implicit def str2IntImplicit(str: String): Int = {
      Integer.parseInt(str)
    }

    // 手动调用隐式转换函数
    func1(str2IntImplicit("100"))
    // 也可以让Scala自动调用
    /**
     * 这里func1需要一个Int类型的参数，但是传入了一个String类型的值
     * Scala在编译的时候，会自动寻找一个隐式转换函数：String => Int
     * 就找到了隐式转换函数str2IntImplicit
     * 所以会先将String类型的值传给 隐式转换函数str2IntImplicit 获得一个Int类型的值
     * 再将 Int类型的值 作为参数传入func1
     */
    func1("100")


  }

}
